上一篇我們介紹了什麼是變數的生命週期,也介紹了區域變數、全域變數是什麼,希望大家有比較弄清楚了!
今天我們來延續上一篇提到的概念,繼續看另一個變數--「靜態變數」!
前一篇我們提到,變數會從被宣告的當下誕生,並且由記憶體分配一個位置給它,直到區塊結束、程式結束而消失,而區域變數則是一離開所在區域則消失,全域變數則需程式結束才會消失。
接下來我們來介紹另一個有趣的變數--「靜態變數」。
我們先來看一段程式碼:
#include <stdio.h>
void test(int);
int main()
{
test(3);
test(2);
return 0;
}
void test(int times){
int x = 0;
for(int i = 0; i<times; i++){
printf("%d\n", x);
x++;
}
printf("----------\n");
}
看得出這是一個副函式內,宣告了一個的區域變數,隨著每次進入副函式而重新宣告,而離開副函式會消亡。
但若今天將副函式中的變數改為靜態變數的話:
#include <stdio.h>
void test(int);
int main()
{
test(3);
test(2);
return 0;
}
void test(int times){
static int x = 0;
for(int i = 0; i<times; i++){
printf("%d\n", x);
x++;
}
printf("----------\n");
}
可以看到這個結果與上一次是大大的不相同了,離開副函式後靜態變數並不會消失,而是保存下來直到下一次使用,所以我們才能看到第二次呼叫副函式時,變數延續了上次呼叫的改變的數值,而這就是靜態變數最為不同的地方。
如果對於變數比較與更詳細介紹有興趣的朋友,可以參考以下這個連結
痞客邦-C 語言:關於變數的二三事
宣告方法
其實就如同一般變數的宣告方式(如果對於變數宣告有疑惑可以參考第六篇),只是我們在最前面加上了「static」,就可以宣告它為靜態變數。
實際應用
#include <stdio.h>
void countNumber(int);
int main()
{
int input = 0;
printf("新增人次: ");
while(scanf("%d", &input)!=EOF){
countNumber(input);
printf("新增人次: ");
}
return 0;
}
void countNumber(int num){
static int total = 0;
total = total+num;
printf("樂園累積旅遊人次: %d\n\n", total);
}
靜態變數的生命週期由第一次宣告開始,直到程式結束而一起消失。
宣告靜態變數時,只要在變數宣告最前面加上static。
由於靜態變數由第一次宣告就一直存在,所以若初始化變數於宣告的同時,數值便不會再次初始化,而是保持變化後的數值。
當區域變數沒有特別宣告為靜態變數時會為自動變數,會自動決定生命週期。